package com.lzh.shijicloudstack.config.enums;

import java.util.EnumSet;
import java.util.Objects;

/**
 * <p>
 * 通用枚举接口
 * </p>
 *
 * @author luzhiheng
 * @date 2024-08-10
 */
public interface ICommonEnum {

    /**
     * 获取value值
     *
     * @return value
     */
    String getValue();

    /**
     * 获取key值
     *
     * @return key
     */
    String getKey();

    /**
     * 根据value获取key
     *
     * @param value value
     * @param clazz clazz
     * @param <E>   E
     * @return key
     */
    static <E extends Enum<E> & ICommonEnum> String getKeyByValue(String value, Class<E> clazz) {
        Objects.requireNonNull(value);
        EnumSet<E> all = EnumSet.allOf(clazz);
        E res = all.stream().filter(e -> e.getValue().equals(value)).findFirst().orElse(null);
        if (res == null) {
            return "";
        }
        return res.getKey();
    }

    /**
     * 根据value获取枚举
     *
     * @param value value
     * @param clazz clazz
     * @param <E>   E
     * @return 枚举
     */
    static <E extends Enum<E> & ICommonEnum> E getEnumByValue(String value, Class<E> clazz) {
        Objects.requireNonNull(value);
        EnumSet<E> all = EnumSet.allOf(clazz);
        return all.stream().filter(e -> e.getValue().equals(value)).findFirst().orElse(null);
    }

    /**
     * 根据key获取value
     *
     * @param key   key
     * @param clazz clazz
     * @param <E>   E
     * @return value
     */
    static <E extends Enum<E> & ICommonEnum> String getValueByKey(String key, Class<E> clazz) {
        Objects.requireNonNull(key);
        EnumSet<E> all = EnumSet.allOf(clazz);
        E res = all.stream().filter(e -> e.getKey().equals(key)).findFirst().orElse(null);
        if (res == null) {
            return "";
        }
        return res.getKey();
    }

    /**
     * 根据key获取枚举
     *
     * @param key   key
     * @param clazz clazz
     * @param <E>   E
     * @return 枚举
     */
    static <E extends Enum<E> & ICommonEnum> E getEnumByKey(String key, Class<E> clazz) {
        Objects.requireNonNull(key);
        EnumSet<E> all = EnumSet.allOf(clazz);
        return all.stream().filter(e -> e.getKey().equals(key)).findFirst().orElse(null);
    }
}